#coding:utf8
from urllib.parse import urlencode,parse_qs
from urllib.request import urlopen
from django.conf import settings
import json


class QQOauth(object):

    def __init__(self,client_id=None,redirect_uri=None,client_secret=None):
        self.client_id = client_id or settings.QQ_APP_ID
        self.redirect_uri = redirect_uri or settings.QQ_REDIRECT_URL
        self.client_secret = client_secret or settings.QQ_APP_KEY


    def get_auth_url(self,state):

        base_url = 'https://graph.qq.com/oauth2.0/authorize?'

        params = {
            'response_type': 'code',
            'client_id': self.client_id,
            'redirect_uri': self.redirect_uri,
            'state': state,
            'scope': 'get_user_info',
        }

        auth_url = base_url + urlencode(params)

        return auth_url

    def get_token(self,code):



        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。

        base_url = 'https://graph.qq.com/oauth2.0/token?'

        params = {
            'grant_type': 'authorization_code',
            'client_id': self.client_id,
            'client_secret': self.client_secret,
            'code': code,
            'redirect_uri': self.redirect_uri
        }

        url = base_url + urlencode(params)

        #发送请求
        response = urlopen(url)

        #读取数据
        response_data = response.read().decode()
        #获取参数
        qs = parse_qs(response_data)

        #获取access_token
        access_token = qs.get('access_token')

        if access_token is None:
            raise Exception('获取access_token失败')
        print(access_token)
        return access_token[0]


    def get_openid(self,access_token):

        # https://graph.qq.com/oauth2.0/me
        # GET
        # access_token        必须      在Step1中获取到的accesstoken。

        # 返回数据PC网站接入时，获取到用户OpenID，返回包如下：
        # callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
        # openid是此网站上唯一对应用户身份的标识，网站可将此ID进行存储便于用户下次登录时辨识其身份，
        # 或将其与用户在网站上的原有账号进行绑定

        base_url = 'https://graph.qq.com/oauth2.0/me?'

        params = {
            'access_token': access_token
        }

        url = base_url + urlencode(params)

        #发送请求
        response = urlopen(url)

        response_data = response.read().decode()

        # 对数据进行截取
        try:
            data  = response_data[10:-4]
        except Exception:
            raise Exception('获取数据失败')

        dict = json.loads(data)

        openid = dict['openid']

        #判断数据
        if openid is not None:
            # openid返回的是数组
            return  openid

